uint generate(uint last, int factor) => (uint)((ulong)(last * factor) % 2147483647);
bool isMatch(uint? a, uint? b) => ((a << 48) >> 48) == ((b << 48) >> 48);
Func GenA = last => generate(last ?? 516, 16807);
Func GenB = last => generate(last ?? 190, 48271);
int countMatches(Func a, Func b, int iterations)
{
uint? lastA = null, lastB = null;
int count = 0;
for (var i = 0; i < iterations; i++)
{
lastA = a(lastA);
lastB = b(lastB);
if (isMatch(lastA, lastB))
count++;
}
return count;
};
var part1 = countMatches(GenA, GenB, 40000000);
part1.Dump();
uint constrainedGenerate(Func gen, uint? last, int f)
{
do
{
last = gen(last);
} while ((last % f != 0));
return last.Value;
};
var p2 = countMatches(last => constrainedGenerate(GenA, last, 4), last => constrainedGenerate(GenB, last, 8), 5000000);
p2.Dump();